PyTorch学习笔记之计算图
1. **args, **kwargs的区别
1 def build_vocab(self, *args, **kwargs): 2 counter = Counter() 3 sources = [] 4 for arg in args: 5 if isinstance(arg, Dataset): 6 sources += [getattr(arg, name) for name, field in 7 arg.fields.items() if field is self] 8 else: 9 sources.append(arg) 10 for data in sources: 11 for x in data: 12 if not self.sequential: 13 x = [x] 14 counter.update(x) 15 specials = list(OrderedDict.fromkeys( 16 tok for tok in [self.pad_token, self.init_token, self.eos_token] 17 if tok is not None)) 18 self.vocab = Vocab(counter, specials=specials, **kwargs)
2. np.sum
1 import numpy as np 2 np.random.seed(0) 3 4 N, D = 3, 4 5 x = np.random.randn(N, D) 6 y = np.random.randn(N, D) 7 z = np.random.randn(N, D) 8 9 a = x * y 10 b = a + z 11 print(b) 12 c = np.sum(b) 13 print(c) # 6.7170085378 14 15 # search the function of np.sum 16 total = 0 17 for i in range(len(b)): 18 for j in range(4): 19 total += b[i][j] 20 print(total) # 6.7170085378
3. use numpy to solve grad
1 import numpy as np 2 N, D = 3, 4 3 x = np.random.randn(N, D) 4 y = np.random.randn(N, D) 5 z = np.random.randn(N, D) 6 7 a = x * y 8 b = a + z 9 # print(b) 10 c = np.sum(b) 11 # print(c) # 6.7170085378 12 13 grad_c = 1.0 14 grad_b = grad_c * np.ones((N, D)) 15 grad_a = grad_b.copy() 16 grad_z = grad_b.copy() 17 grad_x = grad_a * y 18 grad_y = grad_a * x 19 20 print(grad_x) 21 print(grad_y) 22 print(grad_z) 23 ''' 24 [[ 0.04998285 0.32809396 -0.49822878 1.36419309] 25 [-0.52303972 -0.5881509 -0.37058995 -1.42112189] 26 [-0.58705758 -0.26012336 1.31326911 -0.20088737]] 27 [[ 0.14893265 -0.45509058 0.21410015 0.27659 ] 28 [ 0.29617438 0.98971103 2.07310583 -0.0195055 ] 29 [-1.49222601 -0.64073344 -0.18269488 0.26193553]] 30 [[ 1. 1. 1. 1.] 31 [ 1. 1. 1. 1.] 32 [ 1. 1. 1. 1.]] 33 '''
PyTorch自动计算梯度
1 import torch 2 from torch.autograd import Variable 3 4 N, D = 3, 4 5 # define variables to start building a computational graph 6 x = Variable(torch.randn(N, D), requires_grad=True) 7 y = Variable(torch.randn(N, D), requires_grad=True) 8 z = Variable(torch.randn(N, D), requires_grad=True) 9 10 # forward pass looks just like numpy 11 a = x * y 12 b = a + z 13 c = torch.sum(b) 14 15 # calling c,backward() computes all gradients 16 c.backward() 17 print(x.grad.data) 18 print(y.grad.data) 19 print(z.grad.data) 20 ''' 21 -0.9775 -0.0913 0.3710 1.5789 22 0.0896 -0.6563 0.8976 -0.3508 23 -0.9378 0.7028 1.4533 0.9255 24 [torch.FloatTensor of size 3x4] 25 26 27 0.6365 0.2388 -0.4755 -0.9860 28 -0.2403 -0.0468 -0.0470 -1.0132 29 -0.5019 0.5005 -1.9270 1.0030 30 [torch.FloatTensor of size 3x4] 31 32 33 1 1 1 1 34 1 1 1 1 35 1 1 1 1 36 [torch.FloatTensor of size 3x4] 37 '''
x is a variable, requires_grad=True.
x.data is a tensor.
x.grad is a variable of gradients(same shape as x.data).
x.grad.data is a tensor of gradients.
4. 随机数
(1)random.seed(int)
- 给随机数对象一个种子值,用于产生随机序列。
- 对于同一个种子值的输入,之后产生的随机数序列也一样。
- 通常是把时间秒数等变化值作为种子值,达到每次运行产生的随机系列都不一样
- seed() 省略参数,意味着使用当前系统时间生成随机数
(2)random.random()
生成随机浮点数
1 import numpy as np 2 np.random.seed(0) 3 4 print(np.random.random()) # 0.5488135039273248 不随时间改变 5 print(np.random.random()) # 0.7151893663724195 不随时间改变 6 7 np.random.seed(0) 8 print(np.random.random()) # 0.5488135039273248 不随时间改变 9 10 np.random.seed() 11 print(np.random.random()) # 0.9623797942471012 随时间改变 12 np.random.seed() 13 print(np.random.random()) # 0.12734792669918393 随时间改变
(3)random.shuffle
- 对list列表随机打乱顺序,也就是洗牌
- shuffle只作用于list,对Str会报错比如‘abcdfed’,而['1','2','3','5','6','7']可以
1 import numpy as np 2 3 item = [1,2,3,4,5,6,7] 4 print(item) # [1, 2, 3, 4, 5, 6, 7] 5 np.random.shuffle(item) 6 print(item) # [7, 1, 2, 5, 4, 6, 3] 7 8 item2 = ['1','2','3'] 9 np.random.shuffle(item2) 10 print(item2) # ['1', '3', '2']
参考博客:python随机数用法